package br.unipe.oitomaluco.beans;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import java.util.Stack;
import java.util.Vector;
import br.unipe.oitomaluco.beans.Carta.Naipe;
import br.unipe.oitomaluco.beans.Carta.Status;
import br.unipe.oitomaluco.beans.Carta.Valor;
import br.unipe.oitomaluco.view.View;

public class Baralho {

	public Baralho() {
		super();
		baralho.clear();
		cartasDaMesa.clear();
		cartasDoBolo.clear();
	}
	
	final static int QTDE_CARTAS = 8;
	Vector<Carta> baralho = new Vector<Carta>();
	Stack<Carta> cartasDaMesa = new Stack<Carta>();
	Stack<Carta> cartasDoBolo = new Stack<Carta>();
	View view = new View();

	public Vector<Carta> getBaralho() {
		return baralho;
	}

	public void setBaralho(Vector<Carta> baralho) {
		this.baralho = baralho;
	}

	public Stack<Carta> getCartasDaMesa() {
		return cartasDaMesa;
	}

	public void setCartasDaMesa(Stack<Carta> cartasDaMesa) {
		this.cartasDaMesa = cartasDaMesa;
	}

	public Stack<Carta> getCartasDoBolo() {
		return cartasDoBolo;
	}

	public void setCartasDoBolo(Stack<Carta> cartasDoBolo) {
		this.cartasDoBolo = cartasDoBolo;
	}
	
	public View getView() {
		return view;
	}

	public void setView(View view) {
		this.view = view;
	}

	public Vector<Carta> criarBaralho() {
		for (Naipe naipe : Naipe.values()) {
			for (Valor valor : Valor.values()) {
				baralho.add(new Carta(valor, naipe, Status.off));
			}
		}
		embaralharCartas();
		return baralho;
	}

	public void calculaBaralhos(int jogadores) {
		if (jogadores <= 4) {
			criarBaralho();
		} else {
			criarBaralho();
			criarBaralho();
		}
	}
	
	public void auxCalculoBaralho(){ //DESUSO
		int qtde;
		do {
			qtde = getView().qtdeJogador();
			if (qtde > 0 && qtde <= 8) {
				calculaBaralhos(qtde);
			} else {
				view.warnningQtdeJogador();
			}
		} while (qtde <= 0);
	}

	public void exibirCartas() {
		int i = 1;
		for (Carta carta : baralho) {
			System.out.println((i++) + ". " + carta.toString());
		}
	}

	public void exibirCartasPorStatus(Status status) {
		int i = 1;
		for (Carta carta : baralho) {
			if (carta.getStatus() == status) {
				System.out.println((i++) + ". " + carta.toString());
			}
		}
	}

	public void embaralharCartas() {
		Collections.shuffle(baralho);
	}

	public int getTamanho() {
		return this.baralho.size();
	}

	public Carta capturaCarta(int posicao) {
		return this.baralho.get(posicao);
	}

	public void virarCarta(Carta carta) {
		if (carta.getStatus() == Carta.Status.off)
			carta.setStatus(Carta.Status.on);
	}

	public boolean verificarCarta(Carta carta) {
		for (Carta c : baralho) {
			if ((c.getNaipe().equals(carta.getNaipe())) && (c.getValor().equals(carta.getValor()))) {
				return true;
			}
		}
		return false;
	}

	public void resetBaralho() {
		for (int i = 0; i < getTamanho(); i++) {
			baralho.get(i).setStatus(Status.off);
		}
	}

	public List<Carta> distribuirCartas() {
		List<Carta> lista = new ArrayList<Carta>();
		Random random = new Random();
		int sorteio = 0;
		int countCarta = 0;
		while (countCarta < 8) {
			sorteio = random.nextInt(getTamanho());
			if (baralho.get(sorteio).getStatus() == Status.off) {
				lista.add(capturaCarta(sorteio));
				baralho.get(sorteio).setStatus(Status.on);
				countCarta++;
			}
		}
		return lista;
	}
	// --------------------------------------------------------------------------------------//
	public Stack<Carta> cartasEmDesuso() {
		Stack<Carta> pilhaCartas = new Stack<Carta>();
		for (Carta carta : baralho) {
			if (carta.getStatus() == Status.off) {
				pilhaCartas.push(carta);
			}
		}
		setCartasDoBolo(pilhaCartas);
		return pilhaCartas;
	}
	// --------------------------------------------------------------------------------------//
	public void removerCartaDoBolo() {
		System.out.println("QTDE NO BOLO: "+ cartasDaMesa.size());
		Carta c = cartasDoBolo.pop();
		System.out.println(c.toString());
		System.out.println("QTDE NO BOLO: "+ cartasDaMesa.size());
	}
	
	public void exibirCartasEmDesuso() {
		Stack<Carta> pilhaCartas = cartasEmDesuso();
		int i = 1;
		for (Carta carta : pilhaCartas) {
			System.out.println(i++ + ". DESUSO: " + carta.toString());
		}
	}

	public Carta cartaNaMesa(Carta carta) {
		cartasDaMesa.push(carta);
		Carta retorno = cartasDaMesa.peek();
		if (retorno != null) {
			retorno.setStatus(Status.on);
		}
		return retorno;
	}
	
	public void imprimeCartaNaMesa(){
		Carta mesa = cartasDaMesa.peek();
		System.out.println("\n>> CARTA NA MESA: " + mesa.toString() + " | QTDE: ["+getCartasDaMesa().size()+"]\n");
	}
}
